package br.com.gtoolz.myimc.work;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;

import android.annotation.SuppressLint;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import br.com.gtoolz.myimc.CalculoDoImcActivity;
import br.com.gtoolz.myimc.R;
import br.com.gtoolz.myimc.db.ImcDAO;
import br.com.gtoolz.myimc.extras.Valida;
import br.com.gtoolz.myimc.modelo.ResultadoIMC;

public class ImcWork {

	private CalculoDoImcActivity calcImcActivity;
	private EditText et_peso;
	private EditText et_altura;
	private TextView resultadoIMC;
	private TextView situacao;
	private TextView media;
	private TextView dica;
	private LinearLayout layoutSituacao;
	private ImageView imagem;
	private View botaoSalvar;
	private BigDecimal imc;
	protected int mediaId;
	
	public ImcWork(CalculoDoImcActivity activity) {
		this.calcImcActivity = activity;
		this.et_peso = (EditText) activity.findViewById(R.id.et_peso_imc);
		this.et_altura = (EditText) activity.findViewById(R.id.et_altura_imc);
		this.resultadoIMC = (TextView) activity.findViewById(R.id.tv_resultado_imc);
		this.situacao = (TextView) activity.findViewById(R.id.tv_situacao_imc);
		this.media = (TextView) activity.findViewById(R.id.tv_peso_medio_imc);
		this.dica = (TextView) activity.findViewById(R.id.tv_dica_imc);
		this.layoutSituacao = (LinearLayout) activity.findViewById(R.id.layout_situacao);
		this.imagem = (ImageView) activity.findViewById(R.id.iv_imagem_imc);
	}
	
	public ArrayList<Integer> defineSituacao(BigDecimal imc) {
		
		double imcd = imc.doubleValue();
		ArrayList<Integer> listaDeRecursos = new ArrayList<Integer>();
		
		if (imcd > 0 && imcd < 17) {
			listaDeRecursos.add(R.string.muito_abaixo);
			listaDeRecursos.add(R.string.media_muito_abaixo);
			listaDeRecursos.add(R.string.dica_muito_abaixo);
			listaDeRecursos.add(R.drawable.triste);
			listaDeRecursos.add(R.color.Salmon);
			return listaDeRecursos;
		} else if (imcd >= 17 && imcd < 18.50) {
			listaDeRecursos.add(R.string.abaixo);
			listaDeRecursos.add(R.string.media_abaixo);
			listaDeRecursos.add(R.string.dica_abaixo);
			listaDeRecursos.add(R.drawable.normal);
			listaDeRecursos.add(R.color.Yellow);
			return listaDeRecursos;
		} else if (imcd >= 18.50 && imcd < 25) {
			listaDeRecursos.add(R.string.normal);
			listaDeRecursos.add(R.string.media_normal);
			listaDeRecursos.add(R.string.dica_normal);
			listaDeRecursos.add(R.drawable.feliz);
			listaDeRecursos.add(R.color.GreenYellow);
			return listaDeRecursos;
		} else if (imcd >= 25 && imcd < 30) {
			listaDeRecursos.add(R.string.acima);
			listaDeRecursos.add(R.string.media_acima);
			listaDeRecursos.add(R.string.dica_acima);
			listaDeRecursos.add(R.drawable.normal);
			listaDeRecursos.add(R.color.Yellow);
			return listaDeRecursos;
		} else if (imcd >= 30 && imcd < 35) {
			listaDeRecursos.add(R.string.obesidade1);
			listaDeRecursos.add(R.string.media_obesidade1);
			listaDeRecursos.add(R.string.dica_obesidade1);
			listaDeRecursos.add(R.drawable.triste);
			listaDeRecursos.add(R.color.Salmon);
			return listaDeRecursos;
		} else if (imcd >= 35 && imcd < 40) {
			listaDeRecursos.add(R.string.obesidade2);
			listaDeRecursos.add(R.string.media_obesidade2);
			listaDeRecursos.add(R.string.dica_obesidade2);
			listaDeRecursos.add(R.drawable.triste);
			listaDeRecursos.add(R.color.Salmon);
			return listaDeRecursos;
		} else if (imcd >= 40 && imcd < 390) {
			listaDeRecursos.add(R.string.obesidade3);
			listaDeRecursos.add(R.string.media_obesidade3);
			listaDeRecursos.add(R.string.dica_obesidade3);
			listaDeRecursos.add(R.drawable.triste);
			listaDeRecursos.add(R.color.Salmon);
			return listaDeRecursos;
		} else {
			return null;
		}
		
	}
	
	public void calculaIMC() {
		try {
			
			String pesoString = et_peso.getText().toString();
			BigDecimal peso = new BigDecimal(pesoString);
			
			String alturaString = et_altura.getText().toString();
			BigDecimal altura = new BigDecimal(alturaString);
			
			if(!Valida.peso(peso))
				et_peso.setError(calcImcActivity.getString(R.string.err_peso));
			
			if(!Valida.altura(altura))
				et_altura.setError(calcImcActivity.getString(R.string.err_altura));
			
			if(Valida.peso(peso) && Valida.altura(altura)) {
				
				this.imc = peso.divide(altura.pow(2),2,RoundingMode.UP);
				
				try {
					
					ArrayList<Integer> listaDeRecursos = defineSituacao(imc);
					
					int situacaoId = listaDeRecursos.get(0);
					this.mediaId = listaDeRecursos.get(1);
					int dicaId = listaDeRecursos.get(2);
					int imagemId = listaDeRecursos.get(3);
					int corId = listaDeRecursos.get(4);
					int corFundoId = calcImcActivity.getResources().getColor(R.color.DarkSlateGray);
					
					resultadoIMC.setText("IMC: " + imc.toString());
					resultadoIMC.setTextColor(calcImcActivity.getResources().getColor(corId));
					resultadoIMC.setBackgroundColor(corFundoId);
					situacao.setText(calcImcActivity.getResources().getString(situacaoId));
					media.setText(calcImcActivity.getResources().getString(mediaId));
					dica.setText(calcImcActivity.getResources().getString(dicaId));
					imagem.setImageResource(imagemId);
					
					layoutSituacao.setVisibility(LinearLayout.VISIBLE);
					
				} catch (NullPointerException e) {
					
					Toast.makeText(calcImcActivity, R.string.err_imc, Toast.LENGTH_LONG).show();
					
				}

			} 
			
		} catch(NumberFormatException e) {
			
			Toast.makeText(calcImcActivity, R.string.err_preencha_os_campos, Toast.LENGTH_LONG).show();
		}
	}
	
	public void implementaBotaoSalvar() {
		
		botaoSalvar = calcImcActivity.findViewById(R.id.btn_salvar_imc);
		
		botaoSalvar.setOnClickListener(new OnClickListener() {

			
			@SuppressLint("SimpleDateFormat")
			@Override
			public void onClick(View v) {
				
				Date data = new Date();
				SimpleDateFormat formato = new SimpleDateFormat("dd/MM/yyyy");
				String dataString = formato.format(data);
				
				ResultadoIMC elemento = new ResultadoIMC();
				
				elemento.setData(dataString);
				elemento.setImc(imc.toString());
				elemento.setStatus(calcImcActivity.getResources().getString(mediaId));
				
				ImcDAO dao = new ImcDAO(calcImcActivity);
				dao.salvar(elemento);
				
				Toast.makeText(calcImcActivity, R.string.resultado_salvo, Toast.LENGTH_SHORT).show();
			}
			
		});
		
	}

}
